package com.zenithmind.mall.pojo.entity;

import com.baomidou.mybatisplus.annotation.TableName;
import com.zenithmind.common.base.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;

import java.math.BigDecimal;
import java.util.Objects;

/**
 * 购物车实体
 * 
 * @author ZenithMind Team
 * @since 2025-06-09
 */
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("mall_cart")
public class Cart extends BaseEntity {

    /**
     * 用户ID
     */
    private String userId;

    /**
     * 商品ID
     */
    private String productId;

    /**
     * 商品规格ID（如果有规格）
     */
    private String specificationId;

    /**
     * 商品数量
     */
    private Integer quantity;

    /**
     * 商品价格（加入购物车时的价格）
     */
    private BigDecimal price;

    /**
     * 是否选中（0-未选中，1-选中）
     */
    private Integer selected;

    // 业务方法

    /**
     * 检查是否选中
     */
    public boolean isSelected() {
        return Objects.equals(this.selected, 1);
    }

    /**
     * 选中商品
     */
    public void select() {
        this.selected = 1;
    }

    /**
     * 取消选中
     */
    public void unselect() {
        this.selected = 0;
    }

    /**
     * 切换选中状态
     */
    public void toggleSelection() {
        this.selected = isSelected() ? 0 : 1;
    }

    /**
     * 增加数量
     */
    public void increaseQuantity(Integer amount) {
        if (amount != null && amount > 0) {
            this.quantity = (this.quantity != null ? this.quantity : 0) + amount;
        }
    }

    /**
     * 减少数量
     */
    public boolean decreaseQuantity(Integer amount) {
        if (amount == null || amount <= 0) {
            return false;
        }

        int currentQuantity = this.quantity != null ? this.quantity : 0;
        if (currentQuantity <= amount) {
            return false; // 数量不足
        }

        this.quantity = currentQuantity - amount;
        return true;
    }

    /**
     * 设置数量
     */
    public boolean setQuantity(Integer newQuantity) {
        if (newQuantity == null || newQuantity <= 0) {
            return false;
        }
        this.quantity = newQuantity;
        return true;
    }

    /**
     * 计算小计金额
     */
    public BigDecimal calculateTotalAmount() {
        if (price == null || quantity == null) {
            return BigDecimal.ZERO;
        }
        return price.multiply(new BigDecimal(quantity));
    }

    /**
     * 检查商品规格是否匹配
     */
    public boolean matchesSpecification(String productId, String specificationId) {
        if (productId == null || !productId.equals(this.productId)) {
            return false;
        }

        // 如果都没有规格，则匹配
        if (specificationId == null && this.specificationId == null) {
            return true;
        }

        // 如果有一个有规格，一个没有，则不匹配
        if (specificationId == null || this.specificationId == null) {
            return false;
        }

        return specificationId.equals(this.specificationId);
    }

    /**
     * 检查是否可以合并（同一商品同一规格）
     */
    public boolean canMergeWith(Cart other) {
        if (other == null) {
            return false;
        }
        return matchesSpecification(other.getProductId(), other.getSpecificationId());
    }

    /**
     * 合并购物车项
     */
    public boolean mergeWith(Cart other) {
        if (!canMergeWith(other)) {
            return false;
        }

        int otherQuantity = other.getQuantity() != null ? other.getQuantity() : 0;
        increaseQuantity(otherQuantity);

        // 如果另一个商品被选中，则当前商品也选中
        if (other.isSelected()) {
            select();
        }

        return true;
    }

    /**
     * 验证购物车数据完整性
     */
    public boolean isValid() {
        return userId != null && !userId.trim().isEmpty() &&
               productId != null && !productId.trim().isEmpty() &&
               quantity != null && quantity > 0 &&
               price != null && price.compareTo(BigDecimal.ZERO) > 0 &&
               selected != null;
    }

    /**
     * 检查数量是否有效
     */
    public boolean hasValidQuantity() {
        return quantity != null && quantity > 0 && quantity <= 999;
    }

    /**
     * 检查价格是否有效
     */
    public boolean hasValidPrice() {
        return price != null && price.compareTo(BigDecimal.ZERO) > 0;
    }
}
